package com.example.hospitaltraining.service.Impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.hospitaltraining.pojo.Files;
import com.example.hospitaltraining.mapper.FileMapper;
import com.example.hospitaltraining.service.FileService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

@Service
public class FileServiceImp extends ServiceImpl<FileMapper, Files> implements FileService {

    @Value("${files.upload.path}")
    private String fileUploadPath;

    @Value("${server.ip}")
    private String serverIp;

    @Override
    public String upload(MultipartFile file) throws IOException {

        String originalFilename = file.getOriginalFilename();

        String type = FileUtil.extName(originalFilename);

        long size = file.getSize();
        //定义一个文件唯一的标识位
        String uuid = IdUtil.fastSimpleUUID();
        String fileUUID = uuid + StrUtil.DOT + type;
        //文件请求路径
        //把获取到的文件存到指定磁盘目录
        File newFile = new File(fileUploadPath + fileUUID);
        // 判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
        File parentFile = newFile.getParentFile();
        if(!parentFile.exists()) {
            parentFile.mkdirs();
        }

        String url ;
        // 获取文件的md5  相同的文件md5也会相同
        String md5 = SecureUtil.md5(file.getInputStream());
        // 从数据库查询是否存在相同的记录
        Files dbFiles = getFilesMd5(md5);
        if (dbFiles != null) { // 文件已存在
            return dbFiles.getUrl();
        } else {
            // 上传文件到磁盘
            file.transferTo(newFile);
            // 数据库若不存在重复文件，则不删除刚才上传的文件

            url = "https://"+serverIp+"/api/files/" + fileUUID;
            //存储到数据库
            Files saveFile = new Files(originalFilename,type,size/1024,url,md5);
            if("docx".equals(type)){
                switch (originalFilename){
                    case "进修通知.docx":
                        saveFile.setId(1L);
                        this.updateById(saveFile);
                        break;
                    case "录取通知.docx":
                        saveFile.setId(2L);
                        this.updateById(saveFile);
                        break;
                }

            }else {
                if("zip".equals(type)){
                    saveFile.setId(3L);
                    this.updateById(saveFile);
                }else {
                    this.save(saveFile);
                }

            }


        }
        return url;
    }

    /**
     * 通过文件的md5查询文件
     * @param md5
     * @return
     */
    public Files getFilesMd5( String md5){
        // 查询文件的md5是否存在
//        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("md5", md5);
//        List<Files> filesList = fileMapper.selectList(queryWrapper);
        LambdaQueryWrapper<Files> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Files::getMd5,md5);
        List<Files> filesList = this.list(queryWrapper);
        return filesList.size() == 0 ? null : filesList.get(0);
    }

    public void deleteFile(String url){
        LambdaQueryWrapper<Files> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Files::getUrl,url);
        Files one = this.getOne(queryWrapper);
        //数据库删除
        this.removeById(one);
        //本地文件删除
        String[] split = url.split("/");
        File file = new File(fileUploadPath + split[4]);
        file.delete();
        this.removeById(one.getId());
    }

}
